From 120e5a3fedcba3ada72d5454fe4f84907a6c6048 Mon Sep 17 00:00:00 2001 From: "cl349@firebug.cl.cam.ac.uk" Date: Tue, 26 Jul 2005 17:27:26 +0000 Subject: [PATCH] Fix case where watch callback unregisters itself: do not try to ack it Signed-off-by: Rusty Russel Signed-off-by: Christian Limpach --- .../drivers/xen/xenbus/xenbus_xs.c | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c index ccb64f84cc..118069237b 100644 --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_xs.c @@ -485,6 +485,8 @@ int register_xenbus_watch(struct xenbus_watch *watch) return err; } +static struct xenbus_watch *watch_callback; + void unregister_xenbus_watch(struct xenbus_watch *watch) { char token[sizeof(watch) * 2 + 1]; @@ -496,6 +498,10 @@ void unregister_xenbus_watch(struct xenbus_watch *watch) err = xs_unwatch(watch->node, token); list_del(&watch->list); + /* Make sure watch thread knows we unwatched, so don't ack. */ + if (watch_callback == watch) + watch_callback = NULL; + if (err) printk(KERN_WARNING "XENBUS Failed to release watch %s: %i\n", watch->node, err); @@ -523,13 +529,16 @@ static int watch_thread(void *unused) w = find_watch(token); BUG_ON(!w); + watch_callback = w; w->callback(w, node); - /* FIXME: Only ack if it wasn't deleted. */ - err = xs_acknowledge_watch(token); - if (err) - printk(KERN_WARNING - "XENBUS acknowledge %s failed %i\n", - node, err); + + if (watch_callback) { + err = xs_acknowledge_watch(token); + if (err) + printk(KERN_WARNING + "XENBUS ack %s fail %i\n", + node, err); + } kfree(node); } else printk(KERN_WARNING "XENBUS xs_read_watch: %li\n", -- 2.30.2